home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_07_08 / v7n8108a.txt < prev    next >
Text File  |  1989-10-01  |  3KB  |  141 lines

  1.  
  2.  
  3. *** Listing 2 ***
  4.  
  5. /*
  6.  * hn_port.c - MS-DOS version of port-level i/o for the HNL
  7.  *
  8.  * Copyright(c) 1988 by Hobart Corporation.
  9.  * Used with permission.
  10.  */
  11.  
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <glc.h>        /* Greenleaf declarations */
  17. #include <hn.h>
  18. #include <hn_errno.h>
  19.  
  20. #define DIM(a) (sizeof(a) / sizeof(a[0]))
  21.  
  22. static int port_name_to_number(char *name)
  23.     {
  24.     struct pair
  25.         {
  26.         char *name;
  27.         int number;
  28.         };
  29.     static struct pair table[] =
  30.         {{"AUX", COM1}, {"COM1", COM1}, {"COM2", COM2}};
  31.     int i;
  32.  
  33.     for (i = 0; i < DIM(table); ++i)
  34.         if (strcmpi(table[i].name, name) == 0)
  35.             return table[i].number;
  36.     return -1;
  37.     }
  38.  
  39. hn_port *hn_popen(char *dev, hn_bps bps, hn_parity par,
  40.         unsigned data_bits, unsigned stop_bits)
  41.     {
  42.     static unsigned actual_bps[] = {1200, 2400, 4800, 9600};
  43.     static unsigned dos_bps[] = {1200, 2400, 4800, 9600};
  44.     static unsigned dos_parity[] = {P_NONE, P_ODD, P_EVEN};
  45.     hn_port *p = NULL;
  46.     int err = HN_ENONE, number;
  47.  
  48.     if ((number = port_name_to_number(dev)) < 0)
  49.         err = HN_EDEVNAME;
  50.     else if (bps >= DIM(dos_bps))
  51.         err = HN_EBPS;
  52.     else if (par >= DIM(dos_parity))
  53.         err = HN_EPARITY;
  54.     else if (data_bits != 7 && data_bits != 8)
  55.         err = HN_EDATABITS;
  56.     else if (stop_bits != 1 && stop_bits != 2)
  57.         err = HN_ESTOPBITS;
  58.     else
  59.         err = asiopen(number, ASINOUT | ASCII, 2048, 2048,
  60.                 dos_bps[bps], dos_parity[par], stop_bits,
  61.                 data_bits, OFF, OFF);
  62.     if (err == HN_ENONE)
  63.         {
  64.         if ((p = malloc(sizeof(hn_port))) == NULL)
  65.             err = HN_ENOPORTS;
  66.         else
  67.             err = asihold(number, ASINOUT);
  68.         }
  69.     if (err != HN_ENONE)
  70.         {
  71.         if (number >= 0)
  72.             asiquit(number);
  73.         if (p != NULL)
  74.             free(p);
  75.         hn_errno = err;
  76.         return NULL;
  77.         }
  78.     p->number = number;
  79.     p->errno = HN_ENONE;
  80.     return p;
  81.     }
  82.  
  83. int hn_pclose(hn_port *p)
  84.     {
  85.     int err = HN_ENONE;
  86.  
  87.     if (p != NULL)
  88.         {
  89.         if ((err = asiquit(p->number)) != HN_ENONE)
  90.             {
  91.             hn_errno = err;
  92.             return EOF;
  93.             }
  94.         free(p);
  95.         }
  96.     return 0;
  97.     }
  98.  
  99. int hn_penable(hn_port *p)
  100.     {
  101.     if ((p->errno = asiresume(p->number, ASINOUT)) == HN_ENONE)
  102.         return 0;
  103.     hn_errno = p->errno;
  104.     return EOF;
  105.     }
  106.  
  107. int hn_pdisable(hn_port *p)
  108.     {
  109.     if ((p->errno = asihold(p->number, ASINOUT)) == HN_ENONE)
  110.         return 0;
  111.     hn_errno = p->errno;
  112.     return EOF;
  113.     }
  114.  
  115. int hn_pgetc(hn_port *p)
  116.     {
  117.     int c;
  118.  
  119.     if ((c = asigetc(p->number)) >= 0)
  120.         return c;
  121.     if (c != HN_EBUFEMPTY)
  122.         hn_errno = p->errno = c;
  123.     return EOF;
  124.     }
  125.  
  126. int hn_pputc(int c, hn_port *p)
  127.     {
  128.     if ((p->errno = asiputc(p->number, c)) == HN_ENONE)
  129.         return c;
  130.     hn_errno = p->errno;
  131.     return EOF;
  132.     }
  133.  
  134. int hn_pflush(hn_port *p)
  135.     {
  136.     while (!istxempty(p->number))
  137.         ;
  138.     return 0;
  139.     }
  140.  
  141.